Circuit Breaker, Retry, Bulkhead এবং TimeLimiter কনফিগার করা

Java Technologies - স্প্রিং বুট ক্লায়েন্ট (Spring Boot Client) - Circuit Breaker Pattern এবং Resilience4j Integration
137

Resilience4j লাইব্রেরি ব্যবহার করে এই ফিচারগুলো কনফিগার করা যায়।

Resilience4j হলো একটি হালকা ওজনের ফ্রেমওয়ার্ক যা মাইক্রোসার্ভিসের মধ্যে রেসিলিয়েন্স প্যাটার্ন (যেমন: Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter) সহজে প্রয়োগ করতে সাহায্য করে।


১. Maven ডিপেন্ডেন্সি যোগ করা

আপনার pom.xml ফাইলে নিচের ডিপেন্ডেন্সি যুক্ত করুন:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.1</version> <!-- আপনার প্রয়োজন অনুযায়ী ভার্সন ব্যবহার করুন -->
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

২. application.yml কনফিগারেশন

Resilience4j এর জন্য প্রয়োজনীয় কনফিগারেশন application.yml ফাইলে যুক্ত করুন:

resilience4j:
  circuitbreaker:
    configs:
      default:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 10s
        permittedNumberOfCallsInHalfOpenState: 3
        minimumNumberOfCalls: 5
    instances:
      myService:
        baseConfig: default
        slidingWindowSize: 20
        failureRateThreshold: 30

  retry:
    configs:
      default:
        maxAttempts: 3
        waitDuration: 2s
    instances:
      myService:
        maxAttempts: 5
        waitDuration: 1s

  bulkhead:
    configs:
      default:
        maxConcurrentCalls: 10
        maxWaitDuration: 0
    instances:
      myService:
        maxConcurrentCalls: 5

  timelimiter:
    configs:
      default:
        timeoutDuration: 2s
    instances:
      myService:
        timeoutDuration: 3s

৩. সার্ভিস ক্লাসে Circuit Breaker এবং Retry ইমপ্লিমেন্টেশন

Circuit Breaker যুক্ত করা

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class MyService {

    private final RestTemplate restTemplate;

    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @CircuitBreaker(name = "myService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        return restTemplate.getForObject("http://example.com/api", String.class);
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response: Service is unavailable";
    }
}

Retry যুক্ত করা

import io.github.resilience4j.retry.annotation.Retry;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Retry(name = "myService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        // API call logic
        throw new RuntimeException("Simulated exception");
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response: Retry failed";
    }
}

৪. Bulkhead ইমপ্লিমেন্টেশন

Bulkhead প্যাটার্ন ব্যবহার করে নির্দিষ্ট সংখ্যক কনকারেন্ট কল নিয়ন্ত্রণ করা যায়।

import io.github.resilience4j.bulkhead.annotation.Bulkhead;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Bulkhead(name = "myService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        // API call logic
        return "External service response";
    }

    public String fallbackMethod(Throwable throwable) {
        return "Fallback response: Too many concurrent requests";
    }
}

৫. TimeLimiter ইমপ্লিমেন্টেশন

TimeLimiter ব্যবহার করে কোনো সার্ভিসের জন্য নির্দিষ্ট সময়সীমা নির্ধারণ করা যায়।

import io.github.resilience4j.timelimiter.annotation.TimeLimiter;
import org.springframework.stereotype.Service;

import java.util.concurrent.CompletableFuture;

@Service
public class MyService {

    @TimeLimiter(name = "myService")
    public CompletableFuture<String> callExternalService() {
        return CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(3000); // Simulate delay
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return "External service response";
        });
    }
}

৬. লগিং এবং মনিটরিং যুক্ত করা

Resilience4j এর মেট্রিক্সগুলো মনিটর করার জন্য Actuator ব্যবহার করুন।

Maven ডিপেন্ডেন্সি:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml:

management:
  endpoints:
    web:
      exposure:
        include: resilience4j*

উদাহরণ:

http://localhost:8080/actuator/resilience4j এ মেট্রিক্স দেখতে পারবেন।


৭. টিপস:

  1. Fallback Method: প্রতিটি Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter এর জন্য একটি ফallback মেথড ব্যবহার করুন।
  2. Timeout Management: সার্ভিস টাইমআউট সঠিকভাবে সেট করুন।
  3. Custom Configuration: প্রয়োজন অনুযায়ী কনফিগারেশন অ্যাডজাস্ট করুন।
  4. Logging: লগিং ব্যবহার করে প্রতিটি রিকোয়েস্ট এবং এর ফলাফল মনিটর করুন।
  5. Actuator Integration: সিস্টেমের স্বাস্থ্য এবং রিসোর্স ব্যবহারের রিপোর্ট পেতে Actuator ব্যবহার করুন।

উপসংহার

Circuit Breaker, Retry, Bulkhead, এবং TimeLimiter এর সাহায্যে মাইক্রোসার্ভিস অ্যাপ্লিকেশন আরও নির্ভরযোগ্য এবং স্কেলেবল হয়। Resilience4j ফ্রেমওয়ার্ক ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশন সহজেই এই রেসিলিয়েন্স প্যাটার্নগুলো ইমপ্লিমেন্ট করতে পারে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...